/**
 * 这个包里面的类主要是用来建立TFIDF WORD2VEC LDA 等模型的,
 * 这个包里面的通过{@link cn.edu.bjtu.entity.ExecuteContext} ,{@link cn.edu.bjtu.entity.impl.ExecuteContextManager}
 * 和{@link cn.edu.bjtu.entity.ExecuteResult}这三个类,与控制器模块进行交互.
 * 大致思想是这样:
 * 将建立模型,向量转化,建立分类器,对向量进行分类抽象成一个命令{@link cn.edu.bjtu.entity.Command}接口,对于不同的命令可以有不同的实现.
 * 不同的命令执行所需要的参数肯定是不同的,也就是要有不同的执行环境所以,执行环境就是用{@link cn.edu.bjtu.entity.ExecuteContext}这个接口的子类来保存
 * 不同的建立模型,向量转化,分类有着不同的执行环境.
 * 有的命令执行需要调用HTTP服务,那就继承自{@link cn.edu.bjtu.entity.impl.BaseSimpleContext}这个类,然后重写方法返回调用的主机名,端口号,URI,请求参数
 * 请求方式(GET/POST)以及相应数据
 * 如果不需要执行HTTP调用,异步命令就继承自{@link cn.edu.bjtu.entity.impl.AsynModelBuildStateSupportExecuteContext}这个类
 * 如果是同步执行就继承自 {@link cn.edu.bjtu.entity.impl.BaseLocalContext}这个类.
 * 
 * 这里强调一下这个具体环境中的同步和异步
 * 对于这样一个方法
 * <pre>
 * ATRquestMapping(value="some/url")
 * public void method(HttpReq,HttpRes){
 * 
 *        这里写业务逻辑代码,这些代码可以执行完成需要1分钟,有的可以需要一天,有的可能需要一周
 *        如果这个方法不及时执行到reutrn new ModelAndView那么浏览器页面就是一片空白,等待加载
 *        所以同步就是等执行完成在返回结果,
 *        异步就是新开一个线程去执行,然后这个方法及时返回页面给浏览器.不要一直空白,想象一个方法执行1小时才能得到结果,那么浏览器要
 *        空白一个小时这样是不可接受的.
 *        对于30S之内可以完成的任务可以使用同步
 *        像跑LDA WORD2VEC这样的任务就要异步了.
 *       
 * 
 * return new ModelAndView("some/view",model);
 * }
 * 
 * 
 * 异步任务主要是通过发布/订阅,或者有的情况也叫监听者模型来实现的,里面主要元素有事件,发布者,订阅者这几个角色
 * 新线程里面执行的方法参数是通过Event参数传递的
 * 这里面的发布者就是{@link controllers.BaseController}里面的 applicationEventPublisher 这个变量,因为ApplicationEventPublisherAware
 * 被BaseController实现了,所以Spring注入的时候会自动获取发布者(其实就是ApplicationContext这个容器保存所有appContext里面定义Bean的容器本身)
 * 订阅者也就是监听者主要是{@link cn.edu.bjtu.asyn.listener.BuildModelListener},事件主要相关的是{@link cn.edu.bjtu.asyn.event.BuildWord2VecEvent}
 * 等,所以事件里面的参数对象方法会在不同的线程里面被执行,所以要注意加锁和同步.
 * 
 * 每个命令执行完成之后会得到一个{@link cn.edu.bjtu.entity.ExecuteResult}对象,这个对象里面保存了执行的结果,可以根据这个结果里面的数据.返回不同的信息.
 * </pre>
 * 这个ENTITY主要是系统内部使用
 * 一般不对应数据库的表
 * 一般不负责视图的渲染
 * @author alex
 *
 */
package cn.edu.bjtu.entity;
